package pikasial.graphique;

import java.util.Observable;
import java.util.Observer;

import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import javax.swing.tree.TreePath;
import pikasial.fs.Dossier;
import pikasial.images.AlbumPhotos;
import pikasial.images.ListeAlbums;

/**
 * Cette classe représente le panneau de gauche de l'application.
 * <p>
 * Le panneau de gauche est la photothèque, là où l'utilisateur
 * peut naviguer dans les dossiers et les albums qu'il a crée.
 *
 * @author ESIAL - Groupe 14
 */
@SuppressWarnings("serial")
public final class PanneauGauche extends JTabbedPane implements Observer {

    /** L'onglet pour naviguer dans les dossiers. */
    private final NavigateurDossiers navDossiers =
        new NavigateurDossiers();
    /** L'onglet pour naviguer dans les albums. */
    private final NavigateurAlbums navAlbums =
        new NavigateurAlbums();

    public static final String DOSSIERS_LABEL = "Dossiers";
    public static final String ALBUMS_LABEL = "Albums";

    /**
     * Construit le panneau de gauche de l'application.
     */
    public PanneauGauche() {
        super(TOP, SCROLL_TAB_LAYOUT);
        addTab(DOSSIERS_LABEL, navDossiers);
        addTab(ALBUMS_LABEL, navAlbums);
        pikasial.images.ListeAlbums.getInstance().addObserver(this);
        addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent evt) {
                JTabbedPane pane = (JTabbedPane) evt.getSource();
                int sel = pane.getSelectedIndex();
                if (sel == indexOfTab(DOSSIERS_LABEL)) {
                    Dossier selectionArbre = (Dossier) navDossiers.getArbre().getLastSelectedPathComponent();
                    if (selectionArbre != null) {
                        ListeAlbums.getInstance().setAlbumAffiche(selectionArbre);
                    }
                } else if (sel == indexOfTab(ALBUMS_LABEL)) {
                    AlbumPhotos ap = (AlbumPhotos) navAlbums.getSelectedAlbum();
                    if (ap != null) {
                        ListeAlbums.getInstance().setAlbumAffiche(ap);
                    }
                }
            }
       });
    }

    /**
     * Retourne l'onglet de navigation de dossiers.
     * @return le navigateur de dossiers
     */
    public NavigateurDossiers getNavigateurDossier() {
        return navDossiers;
    }

    /**
     * Retourne le panneau contenant la liste des albums.
     * @return le navigateur d'albums
     */
    public NavigateurAlbums getNavigateurAlbums() {
        return navAlbums;
    }

	public void update(Observable obs, Object arg) {
		if (obs == ListeAlbums.getInstance()) {
			if (arg instanceof AlbumPhotos) {
				setSelectedComponent(navAlbums);
				getNavigateurAlbums().setSelectedIndex(getNavigateurAlbums().
						getIndexOf((AlbumPhotos) arg));
			} else if (arg instanceof Dossier) {
				setSelectedComponent(navDossiers);
                                final TreePath tp = pikasial.fs.PikasialFS.getInstance().findPath((Dossier) arg);
				getNavigateurDossier().getArbre().setSelectionPath(tp);
			}
		}
	}
}
